home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume8 / jove / part01 next >
Encoding:
Internet Message Format  |  1987-02-02  |  61.8 KB

  1. Subject:  v08i020:  The JOVE text editor, Part01/13
  2. Newsgroups: mod.sources
  3. Approved: mirror!rs
  4.  
  5. Submitted by: seismo!rochester!jpayne (Jonathan Payne)
  6. Mod.sources: Volume 8, Issue 20
  7. Archive-name: jove/Part01
  8.  
  9. [  Thanks to Jonathan for his persistance and help in getting the latest
  10.    version of JOVE to me for publication.  --r$  ]
  11.  
  12. #! /bin/sh
  13. # This is a shell archive.  Remove anything before this line,
  14. # then unpack it by saving it in a file and typing "sh file".
  15. # If all goes well, you will see the message "End of archive 1 (of 13)."
  16. # Contents:  Makefile Ovmakefile README abbrev.c ask.c buf.c case.c
  17. #   ctype.h io.h doc MANIFEST
  18. PATH=/bin:/usr/bin:/usr/ucb; export PATH
  19. echo shar: extracting "'Makefile'" '(6943 characters)'
  20. if test -f 'Makefile' ; then 
  21.   echo shar: will not over-write existing file "'Makefile'"
  22. else
  23. sed 's/^X//' >Makefile <<'@//E*O*F Makefile//'
  24. X########################################################################
  25. X# This program is Copyright (C) 1986 by Jonathan Payne.  JOVE is       #
  26. X# provided to you without charge, and with no warranty.  You may give  #
  27. X# away copies of JOVE, including sources, provided that this notice is #
  28. X# included in all the files.                                           #
  29. X########################################################################
  30. X
  31. X# TMPDIR is where the tmp files get stored, usually /tmp or /tmp/jove.  If
  32. X# your system does not remove subdirectories of /tmp on reboot (lots do
  33. X# remove them these days) then it makes sense to make TMPDIR be /tmp/jove.
  34. X# But if you want to recover buffers on system crashes, you should create a
  35. X# directory that doesn't get clearned upon reboot, and use that instead.
  36. X# You would probably want to clean out that directory periodically with
  37. X# /etc/cron.  LIBDIR is for online documentation, the PORTSRV process,
  38. X# RECOVER, and the system-wide .joverc file.  BINDIR is where to put the
  39. X# executables JOVE and TEACHJOVE.  MANDIR is where the manual pages go for
  40. X# JOVE, RECOVER and TEACHJOVE.  MANEXT is the extension for the man pages,
  41. X# e.g., jove.1 or jove.l or jove.m.
  42. X
  43. XDESTDIR =
  44. XTMPDIR = /tmp
  45. XLIBDIR = /u/jpayne/jovelib
  46. XBINDIR = /u/jpayne/bin
  47. XMANDIR = /u/jpayne/manl
  48. XMANEXT = l
  49. XSHELL = /bin/csh
  50. X
  51. X# These should all just be right if the above ones are.
  52. XJOVE = $(DESTDIR)$(BINDIR)/jove
  53. XRECOVER = $(DESTDIR)$(LIBDIR)/recover
  54. XTEACHJOVE = $(DESTDIR)$(BINDIR)/teachjove
  55. XJOVERC = $(DESTDIR)$(LIBDIR)/.joverc
  56. XCMDS.DOC = $(DESTDIR)$(LIBDIR)/cmds.doc
  57. XTEACH-JOVE = $(DESTDIR)$(LIBDIR)/teach-jove
  58. XPORTSRV = $(DESTDIR)$(LIBDIR)/portsrv
  59. XJOVEM = $(DESTDIR)$(MANDIR)/jove.$(MANEXT)
  60. XRECOVERM = $(DESTDIR)$(MANDIR)/recover.$(MANEXT)
  61. XTEACHJOVEM = $(DESTDIR)$(MANDIR)/teachjove.$(MANEXT)
  62. X
  63. X# Select the right libraries for your system.
  64. X#    2.9BSD:    LIBS = -ltermcap -ljobs
  65. X#    v7:    LIBS = -ltermcap
  66. X#    4.1BSD:    LIBS = -ltermcap -ljobs
  67. X#    4.2BSD:    LIBS = -ltermcap
  68. X#    4.3BSD:    LIBS = -ltermcap
  69. X#    SysV Rel. 2: LIBS = -lcurses
  70. X
  71. XLIBS = -ltermcap
  72. X
  73. X# If you are not VMUNIX (vax running Berkeley Version 4), you must specify
  74. X# the -i flags (split I/D space) and maybe the -x option (for adb to work).
  75. X#    2.9BSD:    LDFLAGS = -x -i
  76. X#    v7:    LDFLAGS = -x -i
  77. X#    4.1BSD:    LDFLAGS =
  78. X#    4.2BSD:    LDFLAGS =
  79. X#    4.3BSD:    LDFLAGS =
  80. X#    SysV Rel. 2: LDFLAGS = -Ml
  81. X
  82. XLDFLAGS =
  83. X
  84. XCFLAGS = -O
  85. X
  86. XOBJECTS = keymaps.o funcdefs.o abbrev.o ask.o buf.o c.o case.o ctype.o \
  87. X    delete.o disp.o extend.o fp.o fmt.o insert.o io.o iproc.o jove.o macros.o \
  88. X    malloc.o marks.o misc.o move.o paragraph.o proc.o re.o re1.o rec.o \
  89. X    scandir.o screen.o table.o term.o tune.o util.o vars.o version.o wind.o
  90. X
  91. XJOVESRC = funcdefs.c abbrev.c ask.c buf.c c.c case.c ctype.c \
  92. X    delete.c disp.c extend.c fp.c fmt.c insert.c io.c iproc.c \
  93. X    jove.c macros.c malloc.c marks.c misc.c move.c paragraph.c \
  94. X    proc.c re.c re1.c rec.c scandir.c screen.c table.c term.c util.c \
  95. X    vars.c version.c wind.c
  96. X
  97. XSOURCES = $(JOVESRC) portsrv.c recover.c setmaps.c teachjove.c
  98. X
  99. XHEADERS = ctype.h io.h jove.h re.h rec.h table.h temp.h termcap.h tune.h
  100. X
  101. XDOCS =    doc/cmds.doc.nr doc/example.rc doc/jove.1 doc/jove.2 doc/jove.3 \
  102. X    doc/jove.4 doc/jove.5 doc/jove.nr doc/recover.nr doc/system.rc \
  103. X    doc/teach-jove doc/teachjove.nr doc/README
  104. X
  105. XBACKUPS = $(HEADERS) $(JOVESRC) iproc-pipes.c iproc-ptys.c \
  106. X    teachjove.c recover.c setmaps.c portsrv.c tune.template \
  107. X    Makefile Ovmakefile keymaps.txt README $(DOCS)
  108. X
  109. X
  110. Xall:    xjove recover teachjove portsrv
  111. X
  112. Xxjove:    $(OBJECTS)
  113. X    $(CC) $(LDFLAGS) -o xjove $(OBJECTS) version.o $(LIBS)
  114. X    @-size xjove
  115. X    @-date
  116. X
  117. Xportsrv:    portsrv.o
  118. X    cc -o portsrv -n portsrv.o $(LIBS)
  119. X
  120. Xrecover:    recover.o tune.o rec.h temp.h
  121. X    cc -o recover -n recover.o tune.o $(LIBS)
  122. X
  123. Xteachjove:    teachjove.o
  124. X    cc -o teachjove -n teachjove.o $(LIBS)
  125. X
  126. Xsetmaps:    setmaps.o funcdefs.c
  127. X    cc -o setmaps setmaps.o
  128. X
  129. Xteachjove.o:    teachjove.c /usr/include/sys/types.h /usr/include/sys/file.h
  130. X    cc -c $(CFLAGS) -DTEACHJOVE=\"$(TEACH-JOVE)\" teachjove.c
  131. X
  132. Xsetmaps.o:    funcdefs.c keymaps.txt
  133. X
  134. Xkeymaps.c:    setmaps keymaps.txt
  135. X    setmaps < keymaps.txt > keymaps.c
  136. X
  137. Xkeymaps.o:    keymaps.c jove.h
  138. X
  139. Xtune.c: Makefile tune.template
  140. X    @echo "/* Changes should be made in Makefile, not to this file! */" > tune.c
  141. X    @echo "" >> tune.c
  142. X    @sed -e 's;TMPDIR;$(TMPDIR);' \
  143. X         -e 's;LIBDIR;$(LIBDIR);' \
  144. X         -e 's;BINDIR;$(BINDIR);' \
  145. X         -e 's;SHELL;$(SHELL);' tune.template >> tune.c
  146. X
  147. Xinstall: $(DESTDIR)$(LIBDIR) $(TEACH-JOVE) $(CMDS.DOC) $(JOVERC) \
  148. X     $(PORTSRV) $(RECOVER) $(JOVE) $(TEACHJOVE) $(JOVEM) \
  149. X     $(RECOVERM) $(TEACHJOVEM)
  150. X
  151. X$(DESTDIR)$(LIBDIR):
  152. X    -mkdir $(DESTDIR)$(LIBDIR)
  153. X
  154. X$(TEACH-JOVE): doc/teach-jove
  155. X    install -c -m 644 doc/teach-jove $(TEACH-JOVE)
  156. X
  157. Xdoc/cmds.doc:    doc/cmds.doc.nr doc/jove.4 doc/jove.5
  158. X    nroff doc/cmds.doc.nr doc/jove.4 doc/jove.5 > doc/cmds.doc
  159. X
  160. X$(CMDS.DOC): doc/cmds.doc
  161. X    install -c -m 644 doc/cmds.doc $(CMDS.DOC)
  162. X
  163. X$(JOVERC): doc/system.rc
  164. X    install -c -m 644 doc/system.rc $(JOVERC)
  165. X
  166. X$(PORTSRV): portsrv
  167. X    install -c -s -m 755 portsrv $(PORTSRV)
  168. X
  169. X$(RECOVER): recover
  170. X    install -c -s -m 755 recover $(RECOVER)
  171. X
  172. X$(JOVE): xjove
  173. X    install -c -m 755 xjove $(JOVE)
  174. X
  175. X$(TEACHJOVE): teachjove
  176. X    install -c -s -m 755 teachjove $(TEACHJOVE)
  177. X
  178. X$(JOVEM): doc/jove.nr
  179. X    @sed -e 's;TMPDIR;$(TMPDIR);' \
  180. X         -e 's;LIBDIR;$(LIBDIR);' \
  181. X         -e 's;SHELL;$(SHELL);' doc/jove.nr > /tmp/jove.nr
  182. X    install -m 644 /tmp/jove.nr $(JOVEM)
  183. X
  184. X$(RECOVERM): doc/recover.nr
  185. X    @sed -e 's;TMPDIR;$(TMPDIR);' \
  186. X         -e 's;LIBDIR;$(LIBDIR);' \
  187. X         -e 's;SHELL;$(SHELL);' doc/recover.nr > /tmp/recover.nr
  188. X    install -m 644 /tmp/recover.nr $(RECOVERM)
  189. X
  190. X$(TEACHJOVEM): doc/teachjove.nr
  191. X    @sed -e 's;TMPDIR;$(TMPDIR);' \
  192. X         -e 's;LIBDIR;$(LIBDIR);' \
  193. X         -e 's;SHELL;$(SHELL);' doc/teachjove.nr > /tmp/teachjove.nr
  194. X    install -m 644 /tmp/teachjove.nr $(TEACHJOVEM)
  195. X
  196. Xecho:
  197. X    @echo $(C-FILES) $(HEADERS)
  198. X
  199. Xlint:
  200. X    lint -n $(JOVESRC) tune.c keymaps.c
  201. X    @echo Done
  202. X
  203. Xtags:
  204. X    ctags -w $(JOVESRC) $(HEADERS)
  205. X
  206. Xciall:
  207. X    ci $(BACKUPS)
  208. X
  209. Xcoall:
  210. X    co $(BACKUPS)
  211. X
  212. Xjove.shar:
  213. X    shar $(BACKUPS) > jove.shar
  214. X
  215. Xbackup:
  216. X    tar cf backup $(BACKUPS)
  217. X
  218. Xtape-backup:
  219. X    tar cbf 20 /dev/rmt0 $(BACKUPS)
  220. X
  221. Xrtape-backup:
  222. X    rtar cbf 20 sen:/dev/rmt0 $(BACKUPS)
  223. X
  224. Xtouch:
  225. X    touch $(OBJECTS)
  226. X
  227. Xclean:
  228. X    rm -f a.out core *.o keymaps.c tune.c xjove portsrv recover setmaps \
  229. X    teachjove
  230. X
  231. X# This version only works under 4.3BSD
  232. X#depend:
  233. X#    for i in ${SOURCES} ; do \
  234. X#        cc -M ${CFLAGS} $$i | awk ' { if ($$1 != prev) \
  235. X#            { if (rec != "") print rec; rec = $$0; prev = $$1; } \
  236. X#            else { if (length(rec $$2) > 78) { print rec; rec = $$0; } \
  237. X#            else rec = rec " " $$2 } } \
  238. X#            END { print rec } ' >> makedep; done
  239. X#    echo '/^# DO NOT DELETE THIS LINE/+2,$$d' >eddep
  240. X#    echo '$$r makedep' >>eddep
  241. X#    echo 'w' >>eddep
  242. X#    cp Makefile Makefile.bak
  243. X#    ed - Makefile < eddep
  244. X#    rm eddep makedep
  245. X#    echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile
  246. X#    echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile
  247. X#    echo '# see make depend above' >> Makefile
  248. X#
  249. X## DO NOT DELETE THIS LINE -- make depend uses it
  250. @//E*O*F Makefile//
  251. if test 6943 -ne "`wc -c <'Makefile'`"; then
  252.     echo shar: error transmitting "'Makefile'" '(should have been 6943 characters)'
  253. fi
  254. fi # end of overwriting check
  255. echo shar: extracting "'Ovmakefile'" '(6718 characters)'
  256. if test -f 'Ovmakefile' ; then 
  257.   echo shar: will not over-write existing file "'Ovmakefile'"
  258. else
  259. sed 's/^X//' >Ovmakefile <<'@//E*O*F Ovmakefile//'
  260. X########################################################################
  261. X# This program is Copyright (C) 1986 by Jonathan Payne.  JOVE is       #
  262. X# provided to you without charge, and with no warranty.  You may give  #
  263. X# away copies of JOVE, including sources, provided that this notice is #
  264. X# included in all the files.                                           #
  265. X########################################################################
  266. X
  267. X# TMPDIR is where the tmp files get stored, usually /tmp or /tmp/jove.  If
  268. X# your system does not remove subdirectories of /tmp on reboot (lots do
  269. X# remove them these days) then it makes sense to make TMPDIR be /tmp/jove.
  270. X# But if you want to recover buffers on system crashes, you should create a
  271. X# directory that doesn't get clearned upon reboot, and use that instead.
  272. X# You would probably want to clean out that directory periodically with
  273. X# /etc/cron.  LIBDIR is for online documentation, the PORTSRV process,
  274. X# RECOVER, and the system-wide .joverc file.  BINDIR is where to put the
  275. X# executables JOVE and TEACHJOVE.  MANDIR is where the manual pages go for
  276. X# JOVE, RECOVER and TEACHJOVE.  MANEXT is the extension for the man pages,
  277. X# e.g., jove.1 or jove.l or jove.m.
  278. X
  279. XDESTDIR =
  280. XTMPDIR = /tmp
  281. XLIBDIR = /usr/lib/jove
  282. XBINDIR = /bin
  283. XMANDIR = /usr/man/man1
  284. XMANEXT = 1
  285. XSHELL = /bin/csh
  286. X
  287. X# These should all just be right if the above ones are.
  288. XJOVE = $(DESTDIR)$(BINDIR)/jove
  289. XRECOVER = $(DESTDIR)$(LIBDIR)/recover
  290. XTEACHJOVE = $(DESTDIR)$(BINDIR)/teachjove
  291. XJOVERC = $(DESTDIR)$(LIBDIR)/.joverc
  292. XCMDS.DOC = $(DESTDIR)$(LIBDIR)/cmds.doc
  293. XTEACH-JOVE = $(DESTDIR)$(LIBDIR)/teach-jove
  294. XPORTSRV = $(DESTDIR)$(LIBDIR)/portsrv
  295. XJOVEM = $(DESTDIR)$(MANDIR)/jove.$(MANEXT)
  296. XRECOVERM = $(DESTDIR)$(MANDIR)/recover.$(MANEXT)
  297. XTEACHJOVEM = $(DESTDIR)$(MANDIR)/teachjove.$(MANEXT)
  298. X
  299. X# Select the right libraries for your system.
  300. X#    2.9BSD:    LIBS =    -ltermlib -ljobs
  301. X#    v7:    LIBS =    -ltermlib
  302. X#    4.1BSD:    LIBS =    -ltermlib -ljobs
  303. X#    4.2BSD:    LIBS =    -ltermlib
  304. X#    4.3BSD:    LIBS =    -ltermlib
  305. X
  306. XOVLIBS = -lovtermcap -lovjobs
  307. XLIBS = -ltermcap -ljobs
  308. X
  309. X# If you are not VMUNIX (vax running Berkeley Version 4), you must specify
  310. X# the -i flags (split I/D space) and maybe the -x option (for adb to work).
  311. X#    2.9BSD:    LDFLAGS = -x -i
  312. X#    v7:    LDFLAGS = -x -i
  313. X#    4.1BSD:    LDFLAGS =
  314. X#    4.2BSD:    LDFLAGS =
  315. X#    4.3BSD:    LDFLAGS =
  316. X
  317. XLDFLAGS =  -x -i
  318. X
  319. XCFLAGS = -O -V
  320. X
  321. XCOFLAGS = -rworking -q
  322. X
  323. XBASESEG = funcdefs.o keymaps.o ask.o buf.o ctype.o delete.o disp.o fmt.o fp.o \
  324. X      insert.o io.o jove.o malloc.o macros.o marks.o misc.o move.o re.o \
  325. X      screen.o table.o tune.o util.o vars.o version.o
  326. XOVLAY1 = abbrev.o rec.o paragraph.o
  327. XOVLAY2 = c.o wind.o
  328. XOVLAY3 = extend.o
  329. XOVLAY4 = iproc.o re1.o
  330. XOVLAY5 = proc.o scandir.o term.o case.o
  331. X
  332. XOBJECTS = $(BASESEG) $(OVLAY1) $(OVLAY2) $(OVLAY3) $(OVLAY4) $(OVLAY5)
  333. X
  334. XC-FILES = funcdefs.c abbrev.c ask.c buf.c c.c case.c ctype.c delete.c disp.c \
  335. X    extend.c fmt.c fp.c insert.c io.c iproc.c iproc-pipes.c iproc-ptys.c \
  336. X    jove.c macros.c malloc.c marks.c misc.c move.c paragraph.c proc.c \
  337. X    re.c re1.c rec.c scandir.c screen.c table.c term.c util.c vars.c version.c \
  338. X    wind.c
  339. X
  340. XH-FILES = ctype.h io.h jove.h re.h rec.h table.h temp.h termcap.h tune.h
  341. X
  342. XBACKUPS = $(C-FILES) $(H-FILES) $(DOCS) teachjove.c recover.c setmaps.c portsrv.c \
  343. X    tune.template Makefile Ovmakefile keymaps.txt README tags
  344. X
  345. XDOCS =    doc/cmds.doc.nr doc/example.rc doc/jove.1 doc/jove.2 doc/jove.3 \
  346. X    doc/jove.4 doc/jove.nr doc/recover.nr doc/system.rc doc/teach-jove \
  347. X    doc/teachjove.nr doc/README
  348. X
  349. Xall:    xjove recover teachjove portsrv
  350. X
  351. Xxjove:    $(OBJECTS)
  352. X    ld $(LDFLAGS) /lib/crt0.o \
  353. X        -Z $(OVLAY1) \
  354. X        -Z $(OVLAY2) \
  355. X        -Z $(OVLAY3) \
  356. X        -Z $(OVLAY4) \
  357. X        -Z $(OVLAY5) \
  358. X        -L $(BASESEG) \
  359. X        -o xjove $(OVLIBS) -lovc
  360. X    checkobj xjove
  361. X    @-size xjove
  362. X    @-date
  363. X
  364. Xportsrv:    portsrv.c
  365. X    cc -o portsrv -n -O portsrv.c $(LIBS)
  366. X
  367. Xrecover:    recover.c tune.o rec.h temp.h
  368. X    cc -o recover -n -O recover.c tune.o -ljobs
  369. X
  370. Xteachjove:    teachjove.c
  371. X    cc -o teachjove -n -O -DTEACHJOVE=\"$(TEACH-JOVE)\" teachjove.c
  372. X
  373. Xsetmaps:    setmaps.c funcdefs.c
  374. X    cc -o setmaps setmaps.c
  375. X
  376. Xkeymaps.c:    setmaps keymaps.txt
  377. X    setmaps < keymaps.txt > keymaps.c
  378. X
  379. Xtune.c: Makefile tune.template
  380. X    @echo "/* Changes should be made in Makefile, not to this file! */" > tune.c
  381. X    @echo "" >> tune.c
  382. X    @sed -e 's;TMPDIR;$(TMPDIR);' \
  383. X         -e 's;LIBDIR;$(LIBDIR);' \
  384. X         -e 's;BINDIR;$(BINDIR);' \
  385. X         -e 's;SHELL;$(SHELL);' tune.template >> tune.c
  386. X
  387. Xinstall: $(LIBDIR) $(TEACH-JOVE) $(CMDS.DOC) $(JOVERC) $(PORTSRV) $(RECOVER) \
  388. X     $(JOVE) $(TEACHJOVE) $(JOVEM) $(RECOVERM) $(TEACHJOVEM)
  389. X
  390. X$(DESTDIR)$(LIBDIR):
  391. X    -mkdir (DESTDIR)$(LIBDIR)
  392. X
  393. X$(TEACH-JOVE): doc/teach-jove
  394. X    install -c -m 644 doc/teach-jove $(TEACH-JOVE)
  395. X
  396. X$(CMDS.DOC): doc/cmds.doc
  397. X    install -c -m 644 doc/cmds.doc $(CMDS.DOC)
  398. X
  399. X$(JOVERC): doc/system.rc
  400. X    install -c -m 644 doc/system.rc $(JOVERC)
  401. X
  402. X$(PORTSRV): portsrv
  403. X    install -c -m 755 portsrv $(PORTSRV)
  404. X
  405. X$(RECOVER): recover
  406. X    install -c -m 755 recover $(RECOVER)
  407. X
  408. X$(JOVE): xjove
  409. X    install -c -m 755 xjove $(JOVE)
  410. X
  411. X$(TEACHJOVE): teachjove
  412. X    install -c -m 755 teachjove $(TEACHJOVE)
  413. X
  414. X$(JOVEM): doc/jove.nr
  415. X    @sed -e 's;TMPDIR;$(TMPDIR);' \
  416. X         -e 's;LIBDIR;$(LIBDIR);' \
  417. X         -e 's;SHELL;$(SHELL);' doc/jove.nr > /tmp/jove.nr
  418. X    install -m 644 /tmp/jove.nr $(JOVEM)
  419. X
  420. X$(RECOVERM): doc/recover.nr
  421. X    @sed -e 's;TMPDIR;$(TMPDIR);' \
  422. X         -e 's;LIBDIR;$(LIBDIR);' \
  423. X         -e 's;SHELL;$(SHELL);' doc/recover.nr > /tmp/recover.nr
  424. X    install -m 644 /tmp/recover.nr $(RECOVERM)
  425. X
  426. X$(TEACHJOVEM): doc/teachjove.nr
  427. X    @sed -e 's;TMPDIR;$(TMPDIR);' \
  428. X         -e 's;LIBDIR;$(LIBDIR);' \
  429. X         -e 's;SHELL;$(SHELL);' doc/teachjove.nr > /tmp/teachjove.nr
  430. X    install -m 644 /tmp/teachjove.nr $(TEACHJOVEM)
  431. X
  432. Xecho:
  433. X    @echo $(C-FILES) $(H-FILES)
  434. X
  435. Xlint:
  436. X    lint -x $(C-FILES)
  437. X    echo Done
  438. X
  439. Xtags:
  440. X    ctags -w $(C-FILES) $(H-FILES)
  441. X
  442. X
  443. Xjove.shar:
  444. X    shar $(BACKUPS) doc/* > jove.shar
  445. X
  446. Xbackup:
  447. X    tar cf backup $(BACKUPS)
  448. X
  449. Xtape-backup:
  450. X    tar cbf 20 /dev/rmt0 $(BACKUPS)
  451. X
  452. Xclean:
  453. X    rm -f a.out core $(OBJECTS) keymaps.c xjove \
  454. X        portsrv recover setmaps teachjove
  455. X
  456. X# abbrev.o: jove.h tune.h
  457. X# ask.o: jove.h tune.h
  458. X# buf.o: jove.h tune.h
  459. X# c.o: jove.h tune.h
  460. X# delete.o: jove.h tune.h
  461. X# disp.o: jove.h tune.h termcap.h
  462. X# extend.o: jove.h tune.h
  463. X# fmt.o: jove.h tune.h termcap.h
  464. X# funcdefs.o: jove.h tune.h
  465. X# insert.o: jove.h tune.h
  466. X# io.o: jove.h tune.h termcap.h temp.h
  467. X# iproc.o: jove.h tune.h
  468. X# jove.o: jove.h tune.h termcap.h
  469. X# macros.o: jove.h tune.h
  470. X# marks.o: jove.h tune.h
  471. X# misc.o: jove.h tune.h
  472. X# move.o: jove.h tune.h
  473. X# portsrv.o: jove.h tune.h
  474. X# proc.o: jove.h tune.h
  475. X# re.o: jove.h tune.h
  476. X# rec.o: jove.h tune.h temp.h rec.h
  477. X# recover.o: jove.h tune.h temp.h rec.h
  478. X# screen.o: jove.h tune.h temp.h termcap.h
  479. X# setmaps.o: jove.h tune.h
  480. X# term.o: jove.h tune.h
  481. X# tune.o: tune.h
  482. X# util.o: jove.h tune.h
  483. X# wind.o: jove.h tune.h termcap.h
  484. @//E*O*F Ovmakefile//
  485. if test 6718 -ne "`wc -c <'Ovmakefile'`"; then
  486.     echo shar: error transmitting "'Ovmakefile'" '(should have been 6718 characters)'
  487. fi
  488. fi # end of overwriting check
  489. echo shar: extracting "'README'" '(8874 characters)'
  490. if test -f 'README' ; then 
  491.   echo shar: will not over-write existing file "'README'"
  492. else
  493. sed 's/^X//' >README <<'@//E*O*F README//'
  494. X/************************************************************************
  495. X * This program is Copyright (C) 1986 by Jonathan Payne.  JOVE is       *
  496. X * provided to you without charge, and with no warranty.  You may give  *
  497. X * away copies of JOVE, including sources, provided that this notice is *
  498. X * included in all the files.                                           *
  499. X ************************************************************************/
  500. X
  501. XTo make JOVE edit Makefile to set the right directories for the binaries,
  502. Xonline documentation, the man pages, and the TMP files.  (IMPORTANT! read
  503. Xthe Makefile carefully.)  "tune.c" will be created from "tune.template" by
  504. XMAKE automatically, and it will use the directories you specified in the
  505. XMakefile.  (NOTE:  You should never edit tune.c directly because your
  506. Xchanges will be undone by the next make.  If you want to make a change to a
  507. Xpart of tune.c that isn't a directory name, you should edit tune.template.)
  508. XNext you must edit "tune.h" selecting the compile time options you care
  509. Xabout.  See below for a description of all the compile time options.  You
  510. Xcan type "make" to compile XJOVE, PORTSRV (this is compiled but not used on
  511. X4.2+ systems), JOVE_RECOVER and TEACHJOVE.  Test them out to see if they
  512. Xwork.  If they do, type "make install" to install everything where it
  513. Xbelongs.
  514. X
  515. XHere are some things to consider for deciding where to put the tmp files.
  516. XTMPDIR is where the tmp files get stored, usually /tmp or /tmp/jove.  If
  517. Xyour system does not remove subdirectories of /tmp on reboot (lots do
  518. Xremove them these days) then it makes sense to make TMPDIR be /tmp/jove.
  519. XBut if you want to recover buffers on system crashes, you should create a
  520. Xdirectory that doesn't get clearned upon reboot, and use that instead.
  521. XYou would probably want to clean out that directory periodically with
  522. X/etc/cron.
  523. X
  524. XFor the pdp11 version there is the Ovmakefile.  This has only been tested
  525. Xon 2.9bsd.  It works pretty well, actually, and it is possible to turn on
  526. Xall the compile time options with this version.
  527. X
  528. XBug reports:  If you find bugs in JOVE I would appreciate hearing about
  529. Xthem.  (My net address is at end of this message.)  So, send me the bug
  530. Xreports.  If the bug isn't already fixed, I will ask you to send me the
  531. Xfix.  If you haven't found the bug, I may be able to, so don't wait until
  532. Xyou have found it.  If you make improvements to JOVE and want them
  533. Xincorporated into the official version, send me a message explaining what
  534. Xthe change is, and I will decide whether I want to include it.  If it is
  535. Xpossible for your change to be #ifdef'd in, that would be best, since I
  536. Xwant to avoid making JOVE huge.  For instance, if it's a new package type
  537. Xthing (say, like word abbrev. mode, or something) then it would be best
  538. Xif that were a compile-time option.  I will send out periodic updates to
  539. Xmod.sources.  I will report all significant bug fixes there, and to
  540. Xnet.emacs as well.
  541. X
  542. XHere's a list of the compile time options and what they mean:
  543. X
  544. XABBREV       - Enables word-abbrev-mode which again is nice for paper writers.
  545. X
  546. XBACKUPFILES - This enables backing up files on write.  I guess lots of
  547. X          people like this feature.  It enables the feature but you
  548. X          can still control whether files are backed up with the
  549. X          make-backup-files variable.
  550. X
  551. XBIFF       - This enables turning on and off BIFF so your screen doesn't
  552. X          get messed up with messages from BIFF.
  553. X
  554. XBSD4_2     - Obviously, if you're a Berkeley 4.2 system.
  555. X
  556. XBSD4_3       - If you're running a Berkeley 4.3 (or very late 4.2) system.
  557. X         This will automatically define BSD4_2, also.
  558. X
  559. XCHDIR       - This enables the directory commands; PUSHD, POPD, DIRS and
  560. X          CD.  These simulate the csh commands I think exactly.  As
  561. X          a side-effect, absolute pathnames are enabled, which means
  562. X          JOVE parses filenames for "." and ".." and all that to get
  563. X          at what you REALLY mean.  It's nicer when this is enabled,
  564. X          but not essential.
  565. X
  566. XCMT_FMT       - This enables code to format and indent C comments.
  567. X
  568. XID_CHAR       - Enables support for Insert/Delete character on terminals
  569. X         that have those capabilites.  Couple of problems with this code:
  570. X         it's large, takes up lots of I space which is a problem for the
  571. X         smaller computers (pdp11).  Also, it isn't particularly smart
  572. X         and sometimes does really stupid things.  It sometimes uses
  573. X         insert/delete character when simply redrawing would have been
  574. X         faster.  And if you look at code you'll understand why I don't
  575. X         like it all that much.
  576. X
  577. XIPROCS       - Nice feature which lets you run interactive UNIX commands in
  578. X         windows.  In particular, there is a an i-shell command built
  579. X         in which starts up an interactive shell in a window.  This works
  580. X         only on systems with JOB_CONTROL since it relies on the fancy
  581. X         signal mechanism.
  582. X
  583. XJOB_CONTROL - Versions of UNIX that have the job control facility.
  584. X          Berkeley 2.9 system, and the 4.1-3 systems I know have
  585. X          job stopping, so if you're one of those, define
  586. X          this.  The reason MENLO_JCL is defined when JOB_CONTROL
  587. X          is that the 2.9 signal.h file only defines all of the job
  588. X          stopping signals only when MENLO_JCL is defined.
  589. X
  590. XLISP       - Enables Lisp Mode.  This includes code to indent "properly"
  591. X         for Lisp code and new routines to move over s-expressions.
  592. X         You probably won't want (or need) this on PDP-11's.
  593. X
  594. XLSRHS       - This is for the Lincoln-Sudbury Regional High School version
  595. X          of jove, which is where JOVE originated.
  596. X
  597. XMY_MALLOC  - Use the older version of malloc that is more memory efficient
  598. X         for the VAX.  This is MUCH more efficient than the VAX one.
  599. X         The VAX version seems to place more importance on the speed
  600. X         of the allocation than the amount of memory it uses.  Make your
  601. X         choice ... JOVE hardly ever calls malloc, anyway, relatively
  602. X         speaking, since it allocates lines in big chunks.  NOTE: This
  603. X         seems not to work on suns.
  604. X
  605. XPIPEPROCS  - If NOT defined, JOVE will use the Berkeley pseudo-ttys when
  606. X         doing interactive processes.  This is infinitely better,
  607. X         since you get job control and all that stuff on i-shells.
  608. X         If defined, the portsrv program will have to be made, and
  609. X         everything will be done using pipes.
  610. X
  611. XRESHAPING  - This is for BRL or Berkeley 4.3 systems.  It's not something I
  612. X         dealt with so I can't really describe it.  Got something to do
  613. X         with reshaping the windows that UNIX knows about.  When you try
  614. X         to reshape one of those windows, it sends some signal which JOVE
  615. X         catches and uses to resize its windows.
  616. X
  617. XSPELL       - Enables the spell-buffer and parse-spelling-errors commands.
  618. X         They are nice especially if you have lots of paper writers.
  619. X
  620. XWIRED_TERMS - Include compiled-in hard-wired code for certain terminals,
  621. X         like the Concept 100.  If you don't have these terminals,
  622. X         you probably don't need this (but no point in taking it
  623. X         out unless you're low on space).
  624. X
  625. XTo make macro files compatible between machines with different byte order I
  626. Xuse the ntohl() and htonl() calls that are supplied with (as far as I know)
  627. X4.2 systems.  If you're not running 4.2 a bunch of macros will be defined
  628. Xautomatically in macros.c.  From Dave Curry:
  629. X    The "#if" gets all the identifiers of backwards (left-endian)
  630. X    machines, the "#else" handles normal (right-endian)
  631. X    machines....  Just add some remark in the READ_ME for people
  632. X    porting to machines other than the Vax or PDP-11 which are
  633. X    left-endian.
  634. X
  635. X"doc/system.rc" and "doc/example.rc" are jove initialization files.
  636. X"system.rc" is the "system" rc file here at UoR, and it gets ready every
  637. Xtime JOVE starts up FOR EVERYONE.  ("make install" should copy the
  638. Xsystem-wide .joverc to the right place automatically.)  After that JOVE
  639. Xreads an initialization file in the user's home directory, and "example.rc"
  640. Xis mine.
  641. X
  642. XThe files "jove.[12345]" in DOC are the official JOVE manual.  I got
  643. Xpermission from Richard Stallman to use his manual for the original EMACS,
  644. Xmodifying it where necessary for JOVE.  Lots of work was done by Brian
  645. XHarvey on this manual.
  646. X
  647. XThere are man pages for jove, recover and teachjove.  Teachjove is for
  648. Xpeople who have never used EMACS style editors.  It is an interactive
  649. Xtutorial, THE tutorial written by Stallman for the original EMACS, only
  650. Xslightly modified for JOVE in the appropriate places.  The man pages are
  651. Xcompletely up to date, thanks to me.
  652. X
  653. XThanks to Jay Fenlason at Berkeley for writing the original pty code.
  654. X
  655. XThanks to Dave Curry at Purdue for putting in tons of time and effort
  656. Xinto getting JOVE ready.  It just wouldn't be working without his help.
  657. X
  658. XThanks to Jeff Mc Carrell at Berkeley for finding bugs and adding features.
  659. X
  660. X(Thanks to Brian Harvey for teaching me about linked lists ...)
  661. X
  662. XGood luck, have fun.
  663. X    Jonathan Payne (jpayne@rochester until '88)
  664. @//E*O*F README//
  665. if test 8874 -ne "`wc -c <'README'`"; then
  666.     echo shar: error transmitting "'README'" '(should have been 8874 characters)'
  667. fi
  668. fi # end of overwriting check
  669. echo shar: extracting "'abbrev.c'" '(5740 characters)'
  670. if test -f 'abbrev.c' ; then 
  671.   echo shar: will not over-write existing file "'abbrev.c'"
  672. else
  673. sed 's/^X//' >abbrev.c <<'@//E*O*F abbrev.c//'
  674. X/************************************************************************
  675. X * This program is Copyright (C) 1986 by Jonathan Payne.  JOVE is       *
  676. X * provided to you without charge, and with no warranty.  You may give  *
  677. X * away copies of JOVE, including sources, provided that this notice is *
  678. X * included in all the files.                                           *
  679. X ************************************************************************/
  680. X
  681. X#include "jove.h"
  682. X
  683. X#ifdef ABBREV
  684. X
  685. X#include "io.h"
  686. X#include "ctype.h"
  687. X
  688. X#define HASHSIZE    20
  689. X
  690. Xstruct abbrev {
  691. X    unsigned int    a_hash;
  692. X    char    *a_abbrev,
  693. X        *a_phrase;
  694. X    struct abbrev    *a_next;
  695. X    data_obj    *a_cmdhook;
  696. X};
  697. X
  698. X#define GLOBAL    NMAJORS
  699. Xstatic struct abbrev    *A_tables[NMAJORS + 1][HASHSIZE] = {0};
  700. X
  701. Xint AutoCaseAbbrev = 1;
  702. X
  703. Xstatic unsigned int
  704. Xhash(a)
  705. Xregister char    *a;
  706. X{
  707. X    register unsigned int    hashval = 0;
  708. X    register int    c;
  709. X
  710. X    while (c = *a++)
  711. X        hashval = (hashval << 2) + c;
  712. X
  713. X    return hashval;
  714. X}
  715. X
  716. Xstatic
  717. Xdef_abbrev(table)
  718. Xstruct abbrev    *table[HASHSIZE];
  719. X{
  720. X    char    abbrev[100],
  721. X        phrase[100];
  722. X
  723. X    strcpy(abbrev, ask((char *) 0, "abbrev: "));
  724. X    strcpy(phrase, ask((char *) 0, "abbrev: %s phrase: ", abbrev));
  725. X    define(table, abbrev, phrase);
  726. X}
  727. X
  728. Xstatic struct abbrev *
  729. Xlookup(table, abbrev)
  730. Xregister struct abbrev    *table[HASHSIZE];
  731. Xregister char    *abbrev;
  732. X{
  733. X    register struct abbrev    *ap;
  734. X    unsigned int    h;
  735. X
  736. X    h = hash(abbrev);
  737. X    for (ap = table[h % HASHSIZE]; ap; ap = ap->a_next)
  738. X        if (ap->a_hash == h && strcmp(ap->a_abbrev, abbrev) == 0)
  739. X            break;
  740. X    return ap;
  741. X}
  742. X
  743. Xstatic
  744. Xdefine(table, abbrev, phrase)
  745. Xregister struct abbrev    *table[HASHSIZE];
  746. Xchar    *abbrev,
  747. X    *phrase;
  748. X{
  749. X    register struct abbrev    *ap;
  750. X
  751. X    ap = lookup(table, abbrev);
  752. X    if (ap == 0) {
  753. X        register unsigned int    h = hash(abbrev);
  754. X
  755. X        ap = (struct abbrev *) emalloc(sizeof *ap);
  756. X        ap->a_hash = h;
  757. X        ap->a_abbrev = copystr(abbrev);
  758. X        h %= HASHSIZE;
  759. X        ap->a_next = table[h];
  760. X        ap->a_cmdhook = 0;
  761. X        table[h] = ap;
  762. X    } else
  763. X        free(ap->a_phrase);
  764. X    ap->a_phrase = copystr(phrase);
  765. X}
  766. X
  767. XAbbrevExpand()
  768. X{
  769. X    Bufpos    point;
  770. X    char    wordbuf[100];
  771. X    register char    *wp = wordbuf,
  772. X            *cp;
  773. X    register int    c;
  774. X    int    UC_count = 0;
  775. X    struct abbrev    *ap;
  776. X
  777. X    DOTsave(&point);
  778. X    exp = 1;
  779. X    WITH_TABLE(curbuf->b_major)
  780. X    BackWord();
  781. X    while (curchar < point.p_char && ismword(c = linebuf[curchar])) {
  782. X        if (AutoCaseAbbrev) {
  783. X            if (isupper(c)) {
  784. X                UC_count++;
  785. X                c = tolower(c);
  786. X            }
  787. X        }
  788. X
  789. X        *wp++ = c;
  790. X        curchar++;
  791. X    }
  792. X    *wp = '\0';
  793. X    END_TABLE();
  794. X
  795. X    if ((ap = lookup(A_tables[curbuf->b_major], wordbuf)) == 0 &&
  796. X        (ap = lookup(A_tables[GLOBAL], wordbuf)) == 0) {
  797. X        SetDot(&point);
  798. X        return;
  799. X    }
  800. X    DoTimes(DelPChar(), (wp - wordbuf));
  801. X
  802. X    for (cp = ap->a_phrase; c = *cp; ) {
  803. X        if (AutoCaseAbbrev) {
  804. X            Insert(islower(c) && UC_count &&
  805. X                   (cp == ap->a_phrase || (UC_count > 1 && (*(cp - 1) == ' '))) ?
  806. X                toupper(c) : c);
  807. X        }
  808. X        else {
  809. X            Insert(c);
  810. X        }
  811. X        cp++;
  812. X    }
  813. X
  814. X    if (ap->a_cmdhook != 0)
  815. X        ExecCmd(ap->a_cmdhook);
  816. X}
  817. X
  818. Xstatic char    *mode_names[NMAJORS + 1] = {
  819. X    "Fundamental",
  820. X    "Text Mode",
  821. X    "C Mode",
  822. X#ifdef LISP
  823. X    "Lisp Mode",
  824. X#endif
  825. X    "Global"
  826. X};
  827. X
  828. Xstatic
  829. Xsave_abbrevs(file)
  830. Xchar    *file;
  831. X{
  832. X    File    *fp;
  833. X    struct abbrev    *ap,
  834. X            **tp;
  835. X    char    buf[LBSIZE];
  836. X    int    i,
  837. X        count = 0;
  838. X
  839. X    fp = open_file(file, buf, F_WRITE, COMPLAIN, QUIET);
  840. X    for (i = 0; i <= GLOBAL; i++) {
  841. X        fprintf(fp, "------%s abbrevs------\n", mode_names[i]);
  842. X        for (tp = A_tables[i]; tp < &A_tables[i][HASHSIZE]; tp++)
  843. X            for (ap = *tp; ap; ap = ap->a_next) {
  844. X                fprintf(fp, "%s:%s\n",
  845. X                    ap->a_abbrev,
  846. X                    ap->a_phrase);
  847. X                count++;
  848. X            }
  849. X    }
  850. X    f_close(fp);
  851. X    add_mess(" %d written.", count);
  852. X}
  853. X
  854. Xstatic
  855. Xrest_abbrevs(file)
  856. Xchar    *file;
  857. X{
  858. X    int    eof = 0,
  859. X        mode = -1,    /* Will be ++'d immediately */
  860. X        lnum = 0;
  861. X    char    *phrase_p;
  862. X    File    *fp;
  863. X    char    buf[LBSIZE];
  864. X
  865. X    fp = open_file(file, buf, F_READ, COMPLAIN, QUIET);
  866. X    while (mode <= GLOBAL) {
  867. X        eof = f_gets(fp, genbuf, LBSIZE);
  868. X        if (eof || genbuf[0] == '\0')
  869. X            break;
  870. X        lnum++;
  871. X        if (strncmp(genbuf, "------", 6) == 0) {
  872. X            mode++;
  873. X            continue;
  874. X        }
  875. X        if (mode == -1)
  876. Xfmterr:            complain("Abbrev. format error, line %d.", file, lnum);
  877. X        phrase_p = index(genbuf, ':');
  878. X        if (phrase_p == 0)
  879. X            goto fmterr;
  880. X        *phrase_p++ = '\0';    /* Null terminate the abbrev. */
  881. X        define(A_tables[mode], genbuf, phrase_p);
  882. X    }
  883. X    f_close(fp);
  884. X    message(NullStr);
  885. X}
  886. X
  887. XDefGAbbrev()
  888. X{
  889. X    def_abbrev(A_tables[GLOBAL]);
  890. X}
  891. X
  892. XDefMAbbrev()
  893. X{
  894. X    def_abbrev(A_tables[curbuf->b_major]);
  895. X}
  896. X
  897. XSaveAbbrevs()
  898. X{
  899. X    char    filebuf[FILESIZE];
  900. X
  901. X    save_abbrevs(ask_file((char *) 0, (char *) 0, filebuf));
  902. X}
  903. X
  904. XRestAbbrevs()
  905. X{
  906. X    char    filebuf[FILESIZE];
  907. X
  908. X    rest_abbrevs(ask_file((char *) 0, (char *) 0, filebuf));
  909. X}
  910. X
  911. XEditAbbrevs()
  912. X{
  913. X    char    *tname = "jove_wam.$$$",
  914. X        *EditName = "Abbreviation Edit";
  915. X    Buffer    *obuf = curbuf,
  916. X        *ebuf;
  917. X
  918. X    if (ebuf = buf_exists(EditName)) {
  919. X        if (ebuf->b_type != B_SCRATCH)
  920. X            confirm("Over-write buffer %b?", ebuf);
  921. X    }
  922. X    SetBuf(ebuf = do_select(curwind, EditName));
  923. X    ebuf->b_type = B_SCRATCH;
  924. X    initlist(ebuf);
  925. X    /* Empty buffer.  Save the definitions to a tmp file
  926. X       and read them into this buffer so we can edit them. */
  927. X    save_abbrevs(tname);
  928. X    read_file(tname, NO);
  929. X    message("[Edit definitions and then type C-X C-C]");
  930. X    Recur();        /* We edit them ... now */
  931. X    /* RESetBuf in case we deleted the buffer while we were editing. */
  932. X    SetBuf(ebuf = do_select(curwind, EditName));
  933. X    if (IsModified(ebuf)) {
  934. X        SetBuf(ebuf);
  935. X        file_write(tname, 0);
  936. X        rest_abbrevs(tname);
  937. X        unmodify();
  938. X    }
  939. X    (void) unlink(tname);
  940. X    SetBuf(do_select(curwind, obuf->b_name));
  941. X}
  942. X
  943. XBindMtoW()
  944. X{
  945. X    struct abbrev    *ap;
  946. X    char    *word;
  947. X    data_obj    *hook;
  948. X
  949. X    word = ask((char *) 0, "Word: ");
  950. X
  951. X    if ((ap = lookup(A_tables[curbuf->b_major], word)) == 0 &&
  952. X        (ap = lookup(A_tables[GLOBAL], word)) == 0)
  953. X            complain("%s: unknown abbrev.", word);
  954. X
  955. X    hook = findmac("Macro: ");
  956. X    if (hook == 0)
  957. X        complain("[Undefined macro]");
  958. X    ap->a_cmdhook = hook;
  959. X}
  960. X
  961. X#endif ABBREV
  962. @//E*O*F abbrev.c//
  963. if test 5740 -ne "`wc -c <'abbrev.c'`"; then
  964.     echo shar: error transmitting "'abbrev.c'" '(should have been 5740 characters)'
  965. fi
  966. fi # end of overwriting check
  967. echo shar: extracting "'ask.c'" '(9258 characters)'
  968. if test -f 'ask.c' ; then 
  969.   echo shar: will not over-write existing file "'ask.c'"
  970. else
  971. sed 's/^X//' >ask.c <<'@//E*O*F ask.c//'
  972. X/************************************************************************
  973. X * This program is Copyright (C) 1986 by Jonathan Payne.  JOVE is       *
  974. X * provided to you without charge, and with no warranty.  You may give  *
  975. X * away copies of JOVE, including sources, provided that this notice is *
  976. X * included in all the files.                                           *
  977. X ************************************************************************/
  978. X
  979. X#include "jove.h"
  980. X#include "termcap.h"
  981. X#include "ctype.h"
  982. X#include <signal.h>
  983. X#include <varargs.h>
  984. X
  985. X#ifdef F_COMPLETION
  986. X#    include <sys/stat.h>
  987. X#endif
  988. X
  989. Xint    Asking = NO;
  990. Xchar    Minibuf[LBSIZE];
  991. Xprivate Line    *CurAskPtr = 0;    /* points at some line in mini-buffer */
  992. Xprivate Buffer    *AskBuffer = 0;    /* Askbuffer points to actual structure */
  993. X
  994. X/* The way the mini-buffer works is this:  The first line of the mini-buffer
  995. X   is where the user does his stuff.  The rest of the buffer contains
  996. X   strings that the user often wants to use, for instance, file names, or
  997. X   common search strings, etc.  If he types C-N or C-P while in ask(), we
  998. X   bump the point up or down a line and extract the contents (we make sure
  999. X   is somewhere in the mini-buffer). */
  1000. X
  1001. Xstatic Buffer *
  1002. Xget_minibuf()
  1003. X{
  1004. X    if (AskBuffer) {        /* make sure ut still exists */
  1005. X        register Buffer    *b;
  1006. X
  1007. X        for (b = world; b != 0; b = b->b_next)
  1008. X            if (b == AskBuffer)
  1009. X                return b;
  1010. X    }
  1011. X    AskBuffer = do_select((Window *) 0, "*minibuf*");
  1012. X    AskBuffer->b_type = B_SCRATCH;
  1013. X    return AskBuffer;
  1014. X}
  1015. X
  1016. X/* Add a string to the mini-buffer. */
  1017. X
  1018. Xminib_add(str, movedown)
  1019. Xchar    *str;
  1020. X{
  1021. X    register Buffer    *saveb = curbuf;
  1022. X
  1023. X    SetBuf(get_minibuf());
  1024. X    LineInsert(1);
  1025. X    ins_str(str, NO);
  1026. X    if (movedown)
  1027. X        CurAskPtr = curline;
  1028. X    SetBuf(saveb);
  1029. X}
  1030. X
  1031. Xstatic char *
  1032. Xreal_ask(delim, d_proc, def, prompt)
  1033. Xchar    *delim,
  1034. X    *def,
  1035. X    *prompt;
  1036. Xint    (*d_proc)();
  1037. X{
  1038. X    static int    InAsk = 0;
  1039. X    jmp_buf    savejmp;
  1040. X    int    c,
  1041. X        prompt_len;
  1042. X    Buffer    *saveb = curbuf;
  1043. X    int    abort = 0,
  1044. X        no_typed = 0;
  1045. X    data_obj    *push_cmd = LastCmd;
  1046. X    int    o_exp = exp,
  1047. X        o_exp_p = exp_p;
  1048. X
  1049. X    if (InAsk)
  1050. X        complain((char *) 0);
  1051. X    push_env(savejmp);
  1052. X    InAsk++;
  1053. X    SetBuf(get_minibuf());
  1054. X    if (!inlist(AskBuffer->b_first, CurAskPtr))
  1055. X        CurAskPtr = curline;
  1056. X    prompt_len = strlen(prompt);
  1057. X    ToFirst();    /* Beginning of buffer. */
  1058. X    linebuf[0] = '\0';
  1059. X    modify();
  1060. X    makedirty(curline);
  1061. X
  1062. X    if (setjmp(mainjmp))
  1063. X        if (InJoverc) {        /* this is a kludge */
  1064. X            abort++;
  1065. X            goto cleanup;
  1066. X        }
  1067. X
  1068. X    for (;;) {
  1069. X        exp = 1;
  1070. X        exp_p = NO;
  1071. X        last_cmd = this_cmd;
  1072. X        init_strokes();
  1073. Xcont:        s_mess("%s%s", prompt, linebuf);
  1074. X        Asking = curchar + prompt_len;
  1075. X        c = getch();
  1076. X        if ((c == EOF) || index(delim, c)) {
  1077. X            if (d_proc == 0 || (*d_proc)(c) == 0)
  1078. X                goto cleanup;
  1079. X        } else switch (c) {
  1080. X        case CTL(G):
  1081. X            message("[Aborted]");
  1082. X            abort++;
  1083. X            goto cleanup;
  1084. X
  1085. X        case CTL(N):
  1086. X        case CTL(P):
  1087. X            if (CurAskPtr != 0) {
  1088. X                int    n = (c == CTL(P) ? -exp : exp);
  1089. X
  1090. X                CurAskPtr = next_line(CurAskPtr, n);
  1091. X                if (CurAskPtr == curbuf->b_first && CurAskPtr->l_next != 0)
  1092. X                    CurAskPtr = CurAskPtr->l_next;
  1093. X                (void) ltobuf(CurAskPtr, linebuf);
  1094. X                modify();
  1095. X                makedirty(curline);
  1096. X                Eol();
  1097. X                this_cmd = 0;
  1098. X            }
  1099. X            break;
  1100. X
  1101. X        case CTL(R):
  1102. X            if (def)
  1103. X                ins_str(def, NO);
  1104. X            else
  1105. X                rbell();
  1106. X            break;
  1107. X
  1108. X        default:
  1109. X            dispatch(c);
  1110. X            break;
  1111. X        }
  1112. X        if (curbuf != AskBuffer)
  1113. X            SetBuf(AskBuffer);
  1114. X        if (curline != curbuf->b_first) {
  1115. X            CurAskPtr = curline;
  1116. X            curline = curbuf->b_first;    /* with whatever is in linebuf */
  1117. X        }
  1118. X        if (this_cmd == ARG_CMD)
  1119. X            goto cont;
  1120. X    }
  1121. Xcleanup:
  1122. X    pop_env(savejmp);
  1123. X
  1124. X    LastCmd = push_cmd;
  1125. X    exp_p = o_exp_p;
  1126. X    exp = o_exp;
  1127. X    no_typed = (linebuf[0] == '\0');
  1128. X    strcpy(Minibuf, linebuf);
  1129. X    SetBuf(saveb);
  1130. X    InAsk = Asking = Interactive = NO;
  1131. X    if (!abort) {
  1132. X        if (!charp()) {
  1133. X            Placur(ILI, 0);
  1134. X            flusho();
  1135. X        }
  1136. X        if (no_typed)
  1137. X            return 0;
  1138. X    } else
  1139. X        complain(mesgbuf);
  1140. X    return Minibuf;
  1141. X}
  1142. X
  1143. X/* VARARGS2 */
  1144. X
  1145. Xchar *
  1146. Xask(def, fmt, va_alist)
  1147. Xchar    *def,
  1148. X    *fmt;
  1149. Xva_dcl
  1150. X{
  1151. X    char    prompt[128];
  1152. X    char    *ans;
  1153. X    va_list    ap;
  1154. X
  1155. X    va_start(ap);
  1156. X    format(prompt, sizeof prompt, fmt, ap);
  1157. X    va_end(ap);
  1158. X    ans = real_ask("\r\n", (int (*)()) 0, def, prompt);
  1159. X    if (ans == 0) {        /* Typed nothing. */
  1160. X        if (def == 0)
  1161. X            complain("[No default]");
  1162. X        return def;
  1163. X    }
  1164. X    return ans;
  1165. X}
  1166. X
  1167. X/* VARARGS1 */
  1168. X
  1169. Xchar *
  1170. Xdo_ask(delim, d_proc, def, fmt, va_alist)
  1171. Xchar    *delim,
  1172. X    *def,
  1173. X    *fmt;
  1174. Xint    (*d_proc)();
  1175. Xva_dcl
  1176. X{
  1177. X    char    prompt[128];
  1178. X    va_list    ap;
  1179. X
  1180. X    va_start(ap);
  1181. X    format(prompt, sizeof prompt, fmt, ap);
  1182. X    va_end(ap);
  1183. X    return real_ask(delim, d_proc, def, prompt);
  1184. X}
  1185. X
  1186. X/* VARARGS2 */
  1187. X
  1188. Xyes_or_no_p(fmt, va_alist)
  1189. Xchar    *fmt;
  1190. Xva_dcl
  1191. X{
  1192. X    char    prompt[128];
  1193. X    int    c;
  1194. X    va_list    ap;
  1195. X
  1196. X    va_start(ap);
  1197. X    format(prompt, sizeof prompt, fmt, ap);
  1198. X    va_end(ap);
  1199. X    for (;;) {
  1200. X        message(prompt);
  1201. X        Asking = strlen(prompt);    /* so redisplay works */
  1202. X        c = getch();
  1203. X        Asking = NO;
  1204. X        switch (Upper(c)) {
  1205. X        case 'Y':
  1206. X            return YES;
  1207. X
  1208. X        case 'N':
  1209. X            return NO;
  1210. X
  1211. X        case CTL(G):
  1212. X            complain("[Aborted]");
  1213. X
  1214. X        default:
  1215. X            add_mess("[Type Y or N]");
  1216. X            SitFor(10);
  1217. X        }
  1218. X    }
  1219. X    /* NOTREACHED */
  1220. X}
  1221. X
  1222. X#ifdef F_COMPLETION
  1223. Xstatic char    *fc_filebase;
  1224. Xchar    BadExtensions[128] = ".o";
  1225. X
  1226. Xstatic
  1227. Xbad_extension(name, bads)
  1228. Xchar    *name,
  1229. X    *bads;
  1230. X{
  1231. X    char    *ip;
  1232. X    int    namelen = strlen(name),
  1233. X        ext_len,
  1234. X        stop = 0;
  1235. X
  1236. X    do {
  1237. X        if (ip = index(bads, ' '))
  1238. X            *ip = 0;
  1239. X        else {
  1240. X            ip = bads + strlen(bads);
  1241. X            stop++;
  1242. X        }
  1243. X        if ((ext_len = ip - bads) == 0)
  1244. X            continue;
  1245. X        if ((ext_len < namelen) &&
  1246. X            (strcmp(&name[namelen - ext_len], bads) == 0))
  1247. X            return YES;
  1248. X    } while ((bads = ip + 1), !stop);
  1249. X    return NO;
  1250. X}
  1251. X
  1252. Xf_match(file)
  1253. Xchar    *file;
  1254. X{
  1255. X    int    len = strlen(fc_filebase);
  1256. X
  1257. X    return ((len == 0) ||
  1258. X        (strncmp(file, fc_filebase, strlen(fc_filebase)) == 0));
  1259. X}
  1260. X
  1261. Xstatic
  1262. Xisdir(name)
  1263. Xchar    *name;
  1264. X{
  1265. X    struct stat    stbuf;
  1266. X    char    filebuf[FILESIZE];
  1267. X
  1268. X    PathParse(name, filebuf);
  1269. X    return ((stat(filebuf, &stbuf) != -1) &&
  1270. X        (stbuf.st_mode & S_IFDIR) == S_IFDIR);
  1271. X}
  1272. X
  1273. Xstatic
  1274. Xfill_in(dir_vec, n)
  1275. Xregister char    **dir_vec;
  1276. X{
  1277. X    int    minmatch = 0,
  1278. X            numfound = 0,
  1279. X            lastmatch = -1,
  1280. X        i,
  1281. X        the_same = TRUE, /* After filling in, are we the same
  1282. X                    as when we were called? */
  1283. X        is_ntdir;    /* Is Newly Typed Directory name */
  1284. X    char    bads[128];
  1285. X
  1286. X    for (i = 0; i < n; i++) {
  1287. X        strcpy(bads, BadExtensions);
  1288. X        /* bad_extension() is destructive */
  1289. X        if (bad_extension(dir_vec[i], bads))
  1290. X            continue;
  1291. X        if (numfound)
  1292. X            minmatch = min(minmatch,
  1293. X                       numcomp(dir_vec[lastmatch], dir_vec[i]));
  1294. X        else
  1295. X            minmatch = strlen(dir_vec[i]);
  1296. X        lastmatch = i;
  1297. X        numfound++;
  1298. X    }
  1299. X    /* Ugh.  Beware--this is hard to get right in a reasonable
  1300. X       manner.  Please excuse this code--it's past my bedtime. */
  1301. X    if (numfound == 0) {
  1302. X        rbell();
  1303. X        return;
  1304. X    }
  1305. X    Eol();
  1306. X    if (minmatch > strlen(fc_filebase)) {
  1307. X        the_same = FALSE;
  1308. X        null_ncpy(fc_filebase, dir_vec[lastmatch], minmatch);
  1309. X        Eol();
  1310. X        makedirty(curline);
  1311. X    }
  1312. X    is_ntdir = ((numfound == 1) &&
  1313. X            (curchar > 0) &&
  1314. X            (linebuf[curchar - 1] != '/') &&
  1315. X            (isdir(linebuf)));
  1316. X    if (the_same && !is_ntdir) {
  1317. X        add_mess(n == 1 ? " [Unique]" : " [Ambiguous]");
  1318. X        SitFor(7);
  1319. X    }
  1320. X    if (is_ntdir)
  1321. X        Insert('/');
  1322. X}
  1323. X
  1324. Xextern int    alphacomp();
  1325. X
  1326. X/* called from do_ask() when one of "\r\n ?" is typed.  Does the right
  1327. X   thing, depending on which. */
  1328. X
  1329. Xstatic
  1330. Xf_complete(c)
  1331. X{
  1332. X    char    dir[FILESIZE],
  1333. X        **dir_vec;
  1334. X    int    nentries,
  1335. X        i;
  1336. X
  1337. X    if (c == CR || c == LF)
  1338. X        return 0;    /* tells ask to return now */
  1339. X    if ((fc_filebase = rindex(linebuf, '/')) != 0) {
  1340. X        char    tmp[FILESIZE];
  1341. X
  1342. X        null_ncpy(tmp, linebuf, (++fc_filebase - linebuf));
  1343. X        if (tmp[0] == '\0')
  1344. X            strcpy(tmp, "/");
  1345. X        PathParse(tmp, dir);
  1346. X    } else {        
  1347. X        fc_filebase = linebuf;
  1348. X        strcpy(dir, ".");
  1349. X    }
  1350. X    if ((nentries = scandir(dir, &dir_vec, f_match, alphacomp)) == -1) {
  1351. X        add_mess(" [Unknown directory: %s]", dir);
  1352. X        SitFor(7);
  1353. X        return 1;
  1354. X    }
  1355. X    if (nentries == 0) {
  1356. X        add_mess(" [No match]");
  1357. X        SitFor(7);
  1358. X    } else if (c == ' ' || c == '\t')
  1359. X        fill_in(dir_vec, nentries);
  1360. X    else {
  1361. X        /* we're a '?' */
  1362. X        int    maxlen = 0,
  1363. X            ncols,
  1364. X            col,
  1365. X            lines,
  1366. X            linespercol;
  1367. X
  1368. X        TOstart("Completion", FALSE);    /* false means newline only on request */
  1369. X        Typeout("(! means file will not be chosen unless typed explicitly)");
  1370. X        Typeout((char *) 0);
  1371. X        Typeout("Possible completions (in %s):", dir);
  1372. X        Typeout((char *) 0);
  1373. X
  1374. X        for (i = 0; i < nentries; i++)
  1375. X            maxlen = max(strlen(dir_vec[i]), maxlen);
  1376. X        maxlen += 4;    /* pad each column with at least 4 spaces */
  1377. X        ncols = (CO - 2) / maxlen;
  1378. X        linespercol = 1 + (nentries / ncols);
  1379. X
  1380. X        for (lines = 0; lines < linespercol; lines++) {
  1381. X            for (col = 0; col < ncols; col++) {
  1382. X                int    isbad,
  1383. X                    which;
  1384. X                char    bads[128];
  1385. X
  1386. X                which = (col * linespercol) + lines;
  1387. X                if (which >= nentries)
  1388. X                    break;
  1389. X                strcpy(bads, BadExtensions);
  1390. X                isbad = bad_extension(dir_vec[which], bads);
  1391. X                Typeout("%s%-*s", isbad ? "!" : NullStr,
  1392. X                    maxlen - isbad, dir_vec[which]);
  1393. X            }
  1394. X            Typeout((char *) 0);
  1395. X        }
  1396. X        TOstop();
  1397. X    }
  1398. X    freedir(&dir_vec, nentries);
  1399. X    return 1;
  1400. X}
  1401. X
  1402. X#endif
  1403. X
  1404. Xchar *
  1405. Xask_file(prmt, def, buf)
  1406. Xchar    *prmt,
  1407. X    *def,
  1408. X    *buf;
  1409. X{
  1410. X    char    *ans,
  1411. X        prompt[128],
  1412. X        *pretty_name = pr_name(def);
  1413. X
  1414. X    if (prmt)
  1415. X        sprintf(prompt, prmt);
  1416. X    else {
  1417. X        if (def != 0 && *def != '\0')
  1418. X            sprintf(prompt, ": %f (default %s) ", pretty_name);
  1419. X        else
  1420. X            sprintf(prompt, ProcFmt);
  1421. X    }
  1422. X#ifdef F_COMPLETION
  1423. X      ans = real_ask("\r\n \t?", f_complete, pretty_name, prompt);
  1424. X    if (ans == 0 && (ans = pretty_name) == 0)
  1425. X        complain("[No default file name]");
  1426. X#else
  1427. X    ans = ask(pretty_name, prompt);
  1428. X#endif
  1429. X    PathParse(ans, buf);
  1430. X
  1431. X    return buf;
  1432. X}
  1433. @//E*O*F ask.c//
  1434. if test 9258 -ne "`wc -c <'ask.c'`"; then
  1435.     echo shar: error transmitting "'ask.c'" '(should have been 9258 characters)'
  1436. fi
  1437. fi # end of overwriting check
  1438. echo shar: extracting "'buf.c'" '(11056 characters)'
  1439. if test -f 'buf.c' ; then 
  1440.   echo shar: will not over-write existing file "'buf.c'"
  1441. else
  1442. sed 's/^X//' >buf.c <<'@//E*O*F buf.c//'
  1443. X/************************************************************************
  1444. X * This program is Copyright (C) 1986 by Jonathan Payne.  JOVE is       *
  1445. X * provided to you without charge, and with no warranty.  You may give  *
  1446. X * away copies of JOVE, including sources, provided that this notice is *
  1447. X * included in all the files.                                           *
  1448. X ************************************************************************/
  1449. X
  1450. X/* Contains commands that deal with creating, selecting, killing and
  1451. X   listing buffers, and buffer modes, and find-file, etc. */
  1452. X
  1453. X#include "jove.h"
  1454. X
  1455. X#include <sys/stat.h>
  1456. X
  1457. Xchar    *Mainbuf = "Main",
  1458. X    *NoName = "Sans un nom!";
  1459. X
  1460. XBuffer    *world = 0,        /* First in the list */
  1461. X    *curbuf = 0,
  1462. X    *lastbuf = 0;    /* Last buffer we were in so we have a default
  1463. X               buffer during a select buffer. */
  1464. X
  1465. X/* Toggle BIT in the current buffer's minor mode flags.  If argument is
  1466. X   supplied, a positive one always turns on the mode and zero argument
  1467. X   always turns it off. */
  1468. X
  1469. XTogMinor(bit)
  1470. X{
  1471. X    if (exp_p) {
  1472. X        if (exp == 0)
  1473. X            curbuf->b_minor &= ~bit;
  1474. X        else
  1475. X            curbuf->b_minor |= bit;
  1476. X    } else
  1477. X        curbuf->b_minor ^= bit;
  1478. X    UpdModLine++;
  1479. X}
  1480. X
  1481. X/* Creates a new buffer, links it at the end of the buffer chain, and
  1482. X   returns it. */
  1483. X
  1484. Xstatic Buffer *
  1485. Xbuf_alloc()
  1486. X{
  1487. X    register Buffer    *b,
  1488. X            *lastbp;
  1489. X
  1490. X    lastbp = 0;
  1491. X    for (b = world; b != 0; lastbp = b, b = b->b_next)
  1492. X        ;
  1493. X
  1494. X    b = (Buffer *) emalloc(sizeof (Buffer));
  1495. X    if (lastbp)
  1496. X        lastbp->b_next = b;
  1497. X    else
  1498. X        world = b;
  1499. X    b->b_first = 0;
  1500. X    b->b_next = 0;
  1501. X
  1502. X    return b;
  1503. X}
  1504. X
  1505. X/* Makes a buffer and initializes it.  Obsolete.  Used to take two
  1506. X   arguments, a buffer name and a file name. */
  1507. X
  1508. Xstatic Buffer *
  1509. Xmak_buf()
  1510. X{
  1511. X    register Buffer    *newb;
  1512. X    register int    i;
  1513. X
  1514. X    newb = buf_alloc();
  1515. X    newb->b_fname = 0;
  1516. X    newb->b_name = NoName;
  1517. X    set_ino(newb);
  1518. X    newb->b_marks = 0;
  1519. X    newb->b_themark = 0;        /* Index into markring */
  1520. X    /* No marks yet */
  1521. X    for (i = 0; i < NMARKS; i++)
  1522. X        newb->b_markring[i] = 0;
  1523. X    newb->b_modified = 0;
  1524. X    newb->b_type = B_FILE;  /* File until proven SCRATCH */
  1525. X    newb->b_ntbf = 0;
  1526. X    newb->b_minor = 0;
  1527. X    newb->b_major = TEXT;
  1528. X    newb->b_first = 0;
  1529. X    newb->b_keybinds = 0;
  1530. X#ifdef IPROCS
  1531. X    newb->b_process = 0;
  1532. X#endif
  1533. X    initlist(newb);
  1534. X
  1535. X    return newb;
  1536. X}
  1537. X
  1538. XReNamBuf()
  1539. X{
  1540. X    register char    *new = 0,
  1541. X            *prompt = ProcFmt,
  1542. X            *second = "%s already exists; new name? ";
  1543. X
  1544. X    for (;;) {
  1545. X        new = ask((char *) 0, prompt, new);
  1546. X        if (!buf_exists(new))
  1547. X            break;
  1548. X        prompt = second;
  1549. X    }
  1550. X    setbname(curbuf, new);
  1551. X}
  1552. X
  1553. XFindFile()
  1554. X{
  1555. X    register char    *name;
  1556. X    char    fnamebuf[FILESIZE];
  1557. X
  1558. X    name = ask_file((char *) 0, curbuf->b_fname, fnamebuf);
  1559. X    SetABuf(curbuf);
  1560. X    SetBuf(do_find(curwind, name, 0));
  1561. X}
  1562. X
  1563. Xstatic
  1564. Xmkbuflist(bnamp)
  1565. Xregister char    **bnamp;
  1566. X{
  1567. X    register Buffer    *b;
  1568. X
  1569. X    for (b = world; b != 0; b = b->b_next)
  1570. X        if (b->b_name != 0)
  1571. X            *bnamp++ = b->b_name;
  1572. X    *bnamp = 0;
  1573. X}
  1574. X
  1575. Xchar *
  1576. Xask_buf(def)
  1577. XBuffer    *def;
  1578. X{
  1579. X    char    *bnames[100];
  1580. X    register char    *bname;
  1581. X    register int    offset;
  1582. X    char    prompt[100];
  1583. X
  1584. X    if (def != 0 && def->b_name != 0)
  1585. X        sprintf(prompt, ": %f (default %s) ", def->b_name);
  1586. X    else
  1587. X        sprintf(prompt, ProcFmt);
  1588. X    mkbuflist(bnames);
  1589. X    offset = complete(bnames, prompt, RET_STATE);
  1590. X    if (offset == EOF)
  1591. X        complain((char *) 0);
  1592. X    if (offset == ORIGINAL)
  1593. X        bname = Minibuf;
  1594. X    else if (offset == NULLSTRING) {
  1595. X        if (def)
  1596. X            bname = def->b_name;
  1597. X        else
  1598. X            complain((char *) 0);
  1599. X    } else if (offset < 0)
  1600. X        complain((char *) 0);
  1601. X    else
  1602. X        bname = bnames[offset];
  1603. X
  1604. X    return bname;
  1605. X}
  1606. X
  1607. XBufSelect()
  1608. X{
  1609. X    register char    *bname;
  1610. X
  1611. X    bname = ask_buf(lastbuf);
  1612. X    SetABuf(curbuf);
  1613. X    SetBuf(do_select(curwind, bname));
  1614. X}
  1615. X
  1616. Xstatic
  1617. Xdefb_wind(b)
  1618. Xregister Buffer *b;
  1619. X{
  1620. X    register Window    *w = fwind;
  1621. X    char    *alt;
  1622. X
  1623. X    if (lastbuf == b || lastbuf == 0) {
  1624. X        lastbuf = 0;
  1625. X        alt = (b->b_next != 0) ? b->b_next->b_name : Mainbuf;
  1626. X    } else
  1627. X        alt = lastbuf->b_name;
  1628. X
  1629. X    do {
  1630. X        if (w->w_bufp == b) {
  1631. X            if (one_windp())
  1632. X                (void) do_select(w, alt);
  1633. X            else {
  1634. X                register Window    *save = w->w_next;
  1635. X
  1636. X                del_wind(w);
  1637. X                w = save->w_prev;
  1638. X            }
  1639. X        }                
  1640. X        w = w->w_next;
  1641. X    } while (w != fwind);
  1642. X}
  1643. X
  1644. XBuffer *
  1645. XgetNMbuf()
  1646. X{
  1647. X    register Buffer    *delbuf;
  1648. X    register char    *bname;
  1649. X
  1650. X    bname = ask_buf(curbuf);
  1651. X    if ((delbuf = buf_exists(bname)) == 0)
  1652. X        complain("[No such buffer]");
  1653. X    if (delbuf->b_modified)
  1654. X        confirm("%s modified, are you sure? ", bname);
  1655. X    return delbuf;
  1656. X}
  1657. X
  1658. XBufErase()
  1659. X{
  1660. X    register Buffer    *delbuf;
  1661. X
  1662. X    if (delbuf = getNMbuf()) {
  1663. X        initlist(delbuf);
  1664. X        delbuf->b_modified = 0;
  1665. X    }
  1666. X}
  1667. X
  1668. Xstatic
  1669. Xkill_buf(delbuf)
  1670. Xregister Buffer    *delbuf;
  1671. X{
  1672. X    register Buffer    *b,
  1673. X            *lastb = 0;
  1674. X    extern Buffer    *perr_buf;
  1675. X
  1676. X#ifdef IPROCS
  1677. X    pbuftiedp(delbuf);    /* check for lingering processes */
  1678. X#endif
  1679. X    for (b = world; b != 0; lastb = b, b = b->b_next)
  1680. X        if (b == delbuf)
  1681. X            break;
  1682. X    if (lastb)
  1683. X        lastb->b_next = delbuf->b_next;
  1684. X    else
  1685. X        world = delbuf->b_next;
  1686. X
  1687. X#define okay_free(ptr)    if (ptr) free(ptr)
  1688. X
  1689. X    lfreelist(delbuf->b_first);
  1690. X    okay_free(delbuf->b_name);
  1691. X    okay_free(delbuf->b_fname);
  1692. X    free((char *) delbuf);
  1693. X
  1694. X    if (delbuf == lastbuf)
  1695. X        SetABuf(curbuf);
  1696. X    if (perr_buf == delbuf) {
  1697. X        ErrFree();
  1698. X        perr_buf = 0;
  1699. X    }
  1700. X    defb_wind(delbuf);
  1701. X    if (curbuf == delbuf)
  1702. X        SetBuf(curwind->w_bufp);
  1703. X}
  1704. X
  1705. X/* offer to kill some buffers */
  1706. X
  1707. XKillSome()
  1708. X{
  1709. X    register Buffer    *b,
  1710. X            *next;
  1711. X    Buffer    *oldb;
  1712. X    register char    *y_or_n;
  1713. X
  1714. X    for (b = world; b != 0; b = next) {
  1715. X        next = b->b_next;
  1716. X        if (yes_or_no_p("Kill %s? ", b->b_name) == NO)
  1717. X            continue;
  1718. X        if (IsModified(b)) {
  1719. X            y_or_n = ask("No", "%s modified; should I save it? ", b->b_name);
  1720. X            if (Upper(*y_or_n) == 'Y') {
  1721. X                oldb = curbuf;
  1722. X                SetBuf(b);
  1723. X                SaveFile();
  1724. X                SetBuf(oldb);
  1725. X            }
  1726. X        }
  1727. X        kill_buf(b);
  1728. X    }
  1729. X}
  1730. X
  1731. XBufKill()
  1732. X{
  1733. X    Buffer    *b;
  1734. X
  1735. X    if ((b = getNMbuf()) == 0)
  1736. X        return;
  1737. X    kill_buf(b);
  1738. X}
  1739. X
  1740. Xstatic char *
  1741. Xline_cnt(b, buf)
  1742. Xregister Buffer    *b;
  1743. Xchar    *buf;
  1744. X{
  1745. X    register int    nlines = 0;
  1746. X    register Line    *lp;
  1747. X
  1748. X    for (lp = b->b_first; lp != 0; lp = lp->l_next, nlines++)
  1749. X        ;
  1750. X    sprintf(buf, "%d", nlines);
  1751. X    return buf;
  1752. X}
  1753. X
  1754. Xstatic char    *TypeNames[] = {
  1755. X    0,
  1756. X    "Scratch",
  1757. X    "File",
  1758. X    "Process",
  1759. X};
  1760. X
  1761. XBufList()
  1762. X{
  1763. X    register char    *format = "%-2s %-5s %-11s %-1s %-*s  %-s";
  1764. X    register Buffer    *b;
  1765. X    int    bcount = 1,        /* To give each buffer a number */
  1766. X        buf_width = 11;
  1767. X    char    nbuf[10];
  1768. X
  1769. X    for (b = world; b != 0; b = b->b_next)
  1770. X        buf_width = max(buf_width, strlen(b->b_name));
  1771. X
  1772. X    TOstart("Buffer list", TRUE);    /* true means auto-newline */
  1773. X
  1774. X    Typeout("(* means buffer needs saving)");
  1775. X    Typeout("(+ means file hasn't been read yet)");
  1776. X    Typeout(NullStr);
  1777. X    Typeout(format, "NO", "Lines", "Type", NullStr, buf_width, "Name", "File");
  1778. X    Typeout(format, "--", "-----", "----", NullStr, buf_width, "----", "----");
  1779. X    for (b = world; b != 0; b = b->b_next) {
  1780. X        Typeout(format, itoa(bcount++),
  1781. X                line_cnt(b, nbuf),
  1782. X                TypeNames[b->b_type],
  1783. X                IsModified(b) ? "*" :
  1784. X                     b->b_ntbf ? "+" : NullStr,
  1785. X                buf_width,
  1786. X                /* For the * (variable length field) */
  1787. X                b->b_name,
  1788. X                filename(b));
  1789. X
  1790. X        if (TOabort)
  1791. X            break;
  1792. X    }
  1793. X    TOstop();
  1794. X}
  1795. X
  1796. Xbufname(b)
  1797. Xregister Buffer    *b;
  1798. X{
  1799. X    char    tmp[100],
  1800. X        *cp;
  1801. X    int    try = 1;
  1802. X
  1803. X    if (b->b_fname == 0)
  1804. X        complain("[No file name]");
  1805. X    cp = basename(b->b_fname);
  1806. X    strcpy(tmp, cp);
  1807. X    while (buf_exists(tmp)) {
  1808. X        sprintf(tmp, "%s.%d", cp, try);
  1809. X        try++;
  1810. X    }
  1811. X    setbname(b, tmp);
  1812. X}
  1813. X
  1814. Xinitlist(b)
  1815. Xregister Buffer    *b;
  1816. X{
  1817. X    lfreelist(b->b_first);
  1818. X    b->b_first = b->b_dot = b->b_last = 0;
  1819. X    (void) listput(b, b->b_first);
  1820. X    
  1821. X    SavLine(b->b_dot, NullStr);
  1822. X    b->b_char = 0;
  1823. X    AllMarkSet(b, b->b_dot, 0);
  1824. X    if (b == curbuf)
  1825. X        getDOT();
  1826. X}
  1827. X
  1828. X/* Returns pointer to buffer with name NAME, or if NAME is a string of digits
  1829. X   returns the buffer whose number equals those digits.  Otherwise, returns
  1830. X   0. */
  1831. X
  1832. XBuffer *
  1833. Xbuf_exists(name)
  1834. Xregister char    *name;
  1835. X{
  1836. X    register Buffer    *bp;
  1837. X    register int    n;
  1838. X
  1839. X    if (name == 0)
  1840. X        return 0;
  1841. X
  1842. X    for (bp = world; bp != 0; bp = bp->b_next)
  1843. X        if (strcmp(bp->b_name, name) == 0)
  1844. X            return bp;
  1845. X
  1846. X    /* Doesn't match any names.  Try for a buffer number... */
  1847. X
  1848. X    if ((n = chr_to_int(name, 10, 1)) > 0) {
  1849. X        for (bp = world; n > 1; bp = bp->b_next) {
  1850. X            if (bp == 0)
  1851. X                break;
  1852. X            --n;
  1853. X        }
  1854. X        return bp;
  1855. X    }
  1856. X
  1857. X    return 0;
  1858. X}
  1859. X
  1860. X/* Returns buffer pointer with a file name NAME, if one exists.  Stat's the
  1861. X   file and compares inodes, in case NAME is a link, as well as the actual
  1862. X   characters that make up the file name. */
  1863. X
  1864. XBuffer *
  1865. Xfile_exists(name)
  1866. Xregister char    *name;
  1867. X{
  1868. X    struct stat    stbuf;
  1869. X    register struct stat    *s = &stbuf;
  1870. X    register Buffer    *b = 0;
  1871. X    char    fnamebuf[FILESIZE];
  1872. X
  1873. X    if (name) {
  1874. X        PathParse(name, fnamebuf);
  1875. X        if (stat(fnamebuf, s) == -1)
  1876. X            s->st_ino = 0;
  1877. X        for (b = world; b != 0; b = b->b_next) {
  1878. X            if ((b->b_ino != 0 && b->b_ino == s->st_ino) ||
  1879. X                (strcmp(b->b_fname, fnamebuf) == 0))
  1880. X                break;
  1881. X        }
  1882. X    }
  1883. X    return b;
  1884. X}
  1885. X
  1886. Xchar *
  1887. Xralloc(obj, size)
  1888. Xregister char    *obj;
  1889. X{
  1890. X    register char    *new;
  1891. X
  1892. X    if (obj)
  1893. X        new = realloc(obj, (unsigned) size);
  1894. X    if (new == 0 || !obj)
  1895. X        new = emalloc(size);
  1896. X    return new;
  1897. X}
  1898. X
  1899. Xsetbname(b, name)
  1900. Xregister Buffer    *b;
  1901. Xregister char    *name;
  1902. X{
  1903. X    UpdModLine++;    /* Kludge ... but speeds things up considerably */
  1904. X    if (name) {
  1905. X        if (b->b_name == NoName)
  1906. X            b->b_name = 0;
  1907. X        b->b_name = ralloc(b->b_name, strlen(name) + 1);
  1908. X        strcpy(b->b_name, name);
  1909. X    } else
  1910. X        b->b_name = 0;
  1911. X}
  1912. X
  1913. Xsetfname(b, name)
  1914. Xregister Buffer    *b;
  1915. Xregister char    *name;
  1916. X{
  1917. X    char    wholename[FILESIZE],
  1918. X        oldname[FILESIZE],
  1919. X        *oldptr = oldname;
  1920. X    Buffer    *save = curbuf;
  1921. X
  1922. X    SetBuf(b);
  1923. X    UpdModLine++;    /* Kludge ... but speeds things up considerably */
  1924. X    if (b->b_fname == 0)
  1925. X        oldptr = 0;
  1926. X    else
  1927. X        strcpy(oldname, b->b_fname);
  1928. X    if (name) {
  1929. X        PathParse(name, wholename);
  1930. X        curbuf->b_fname = ralloc(curbuf->b_fname, strlen(wholename) + 1);
  1931. X        strcpy(curbuf->b_fname, wholename);
  1932. X    } else
  1933. X        b->b_fname = 0;
  1934. X    DoAutoExec(curbuf->b_fname, oldptr);
  1935. X    curbuf->b_mtime = curbuf->b_ino = 0;    /* until they're known. */
  1936. X    SetBuf(save);
  1937. X}
  1938. X
  1939. Xset_ino(b)
  1940. Xregister Buffer    *b;
  1941. X{
  1942. X    struct stat    stbuf;
  1943. X
  1944. X    if (b->b_fname == 0 || stat(b->b_fname, &stbuf) == -1) {
  1945. X        b->b_ino = 0;
  1946. X        b->b_mtime = 0;
  1947. X    } else {
  1948. X        b->b_ino = stbuf.st_ino;
  1949. X        b->b_mtime = stbuf.st_mtime;
  1950. X    }
  1951. X}
  1952. X
  1953. X/* Find the file `fname' into buf and put in in window `w' */
  1954. X
  1955. XBuffer *
  1956. Xdo_find(w, fname, force)
  1957. Xregister Window    *w;
  1958. Xregister char    *fname;
  1959. X{
  1960. X    register Buffer    *b;
  1961. X
  1962. X    b = file_exists(fname);
  1963. X    if (b == 0) {
  1964. X        b = mak_buf();
  1965. X        setfname(b, fname);
  1966. X        bufname(b);
  1967. X        set_ino(b);
  1968. X        b->b_ntbf = 1;
  1969. X        if (force) {
  1970. X            Buffer    *oldb = curbuf;
  1971. X
  1972. X            SetBuf(b);    /* this'll read the file */
  1973. X            SetBuf(oldb);
  1974. X        }
  1975. X    }
  1976. X
  1977. X    if (w)
  1978. X        tiewind(w, b);
  1979. X    return b;
  1980. X}
  1981. X
  1982. X/* set alternate buffer */
  1983. X
  1984. XSetABuf(b)
  1985. XBuffer    *b;
  1986. X{
  1987. X    if (b != 0)
  1988. X        lastbuf = b;
  1989. X}
  1990. X
  1991. XSetBuf(newbuf)
  1992. Xregister Buffer    *newbuf;
  1993. X{
  1994. X    register Buffer    *oldb = curbuf;
  1995. X
  1996. X    if (newbuf == curbuf || newbuf == 0)
  1997. X        return;
  1998. X
  1999. X    lsave();
  2000. X    curbuf = newbuf;
  2001. X    curline = newbuf->b_dot;
  2002. X    curchar = newbuf->b_char;
  2003. X    getDOT();
  2004. X    /* Do the read now ... */
  2005. X    if (curbuf->b_ntbf)
  2006. X        read_file(curbuf->b_fname, 0);
  2007. X
  2008. X#ifdef IPROCS
  2009. X    if (oldb != 0 && ((oldb->b_process == 0) != (curbuf->b_process == 0))) {
  2010. X        if (curbuf->b_process)
  2011. X            PushPBs();        /* Push process bindings */
  2012. X        else if (oldb->b_process)
  2013. X            PopPBs();
  2014. X    }
  2015. X#endif
  2016. X}
  2017. X
  2018. XBuffer *
  2019. Xdo_select(w, name)
  2020. Xregister Window    *w;
  2021. Xregister char    *name;
  2022. X{
  2023. X    register Buffer    *new;
  2024. X
  2025. X    if ((new = buf_exists(name)) == 0) {
  2026. X        new = mak_buf();
  2027. X        setfname(new, (char *) 0);
  2028. X        setbname(new, name);
  2029. X    }
  2030. X    if (w)
  2031. X        tiewind(w, new);
  2032. X    return new;
  2033. X}
  2034. @//E*O*F buf.c//
  2035. if test 11056 -ne "`wc -c <'buf.c'`"; then
  2036.     echo shar: error transmitting "'buf.c'" '(should have been 11056 characters)'
  2037. fi
  2038. fi # end of overwriting check
  2039. echo shar: extracting "'case.c'" '(2610 characters)'
  2040. if test -f 'case.c' ; then 
  2041.   echo shar: will not over-write existing file "'case.c'"
  2042. else
  2043. sed 's/^X//' >case.c <<'@//E*O*F case.c//'
  2044. X/************************************************************************
  2045. X * This program is Copyright (C) 1986 by Jonathan Payne.  JOVE is       *
  2046. X * provided to you without charge, and with no warranty.  You may give  *
  2047. X * away copies of JOVE, including sources, provided that this notice is *
  2048. X * included in all the files.                                           *
  2049. X ************************************************************************/
  2050. X
  2051. X#include "jove.h"
  2052. X#include "ctype.h"
  2053. X
  2054. XCapChar()
  2055. X{
  2056. X    register int    num,
  2057. X            restore = 0;
  2058. X    Bufpos    b;
  2059. X
  2060. X    DOTsave(&b);
  2061. X
  2062. X    if (exp < 0) {
  2063. X        restore++;
  2064. X        exp = -exp;
  2065. X        num = exp;
  2066. X        BackChar();    /* Cap previous EXP chars */
  2067. X    } else
  2068. X        num = exp;
  2069. X        
  2070. X    exp = 1;    /* So all the commands are done once */
  2071. X
  2072. X    while (num--) {
  2073. X        if (upper(&linebuf[curchar])) {
  2074. X            modify();
  2075. X            makedirty(curline);
  2076. X        }
  2077. X        if (eolp()) {
  2078. X            if (curline->l_next == 0)
  2079. X                break;
  2080. X            SetLine(curline->l_next);
  2081. X        }
  2082. X        else
  2083. X            curchar++;
  2084. X    }
  2085. X    if (restore)
  2086. X        SetDot(&b);
  2087. X}
  2088. X
  2089. XCapWord()
  2090. X{
  2091. X    register int    num,
  2092. X            restore = 0;
  2093. X    Bufpos    b;
  2094. X
  2095. X    DOTsave(&b);
  2096. X
  2097. X    if (exp < 0) {
  2098. X        restore++;
  2099. X        exp = -exp;
  2100. X        num = exp;
  2101. X        BackWord();    /* Cap previous EXP words */
  2102. X    } else
  2103. X        num = exp;
  2104. X        
  2105. X    exp = 1;    /* So all the commands are done once */
  2106. X
  2107. X    while (num--) {
  2108. X        to_word(1);    /* Go to the beginning of the next word. */
  2109. X        if (eobp())
  2110. X            break;
  2111. X        if (upper(&linebuf[curchar])) {
  2112. X            modify();
  2113. X            makedirty(curline);
  2114. X        }
  2115. X        curchar++;
  2116. X        while (!eolp() && isword(linebuf[curchar])) {
  2117. X            if (lower(&linebuf[curchar])) {
  2118. X                modify();
  2119. X                makedirty(curline);
  2120. X            }
  2121. X            curchar++;
  2122. X        }
  2123. X    }
  2124. X    if (restore)
  2125. X        SetDot(&b);
  2126. X}
  2127. X
  2128. Xcase_word(up)
  2129. X{
  2130. X    Bufpos    before;
  2131. X
  2132. X    DOTsave(&before);
  2133. X    ForWord();    /* This'll go backward if negative argument. */
  2134. X    case_reg(before.p_line, before.p_char, curline, curchar, up);
  2135. X}
  2136. X
  2137. Xstatic
  2138. Xupper(c)
  2139. Xregister char    *c;
  2140. X{
  2141. X    if (islower(*c)) {
  2142. X        *c -= ' ';
  2143. X        return 1;
  2144. X    }
  2145. X    return 0;
  2146. X}
  2147. X
  2148. Xstatic
  2149. Xlower(c)
  2150. Xregister char    *c;
  2151. X{
  2152. X    if (isupper(*c)) {
  2153. X        *c += ' ';
  2154. X        return 1;
  2155. X    }
  2156. X    return 0;
  2157. X}
  2158. X
  2159. Xcase_reg(line1, char1, line2, char2, up)
  2160. XLine    *line1,
  2161. X    *line2;
  2162. Xint    char1;
  2163. X{
  2164. X    (void) fixorder(&line1, &char1, &line2, &char2);
  2165. X    DotTo(line1, char1);
  2166. X
  2167. X    exp = 1;
  2168. X    for (;;) {
  2169. X        if (curline == line2 && curchar == char2)
  2170. X            break;
  2171. X        if (!eolp())
  2172. X            if ((up) ? upper(&linebuf[curchar]) : lower(&linebuf[curchar])) {
  2173. X                makedirty(curline);
  2174. X                modify();
  2175. X            }
  2176. X        ForChar();
  2177. X    }
  2178. X}
  2179. X
  2180. XCasRegLower()
  2181. X{
  2182. X    CaseReg(0);
  2183. X}
  2184. X
  2185. XCasRegUpper()
  2186. X{
  2187. X    CaseReg(1);
  2188. X}
  2189. X
  2190. XCaseReg(up)
  2191. X{
  2192. X    register Mark    *mp = CurMark();
  2193. X    Bufpos    savedot;
  2194. X
  2195. X    DOTsave(&savedot);
  2196. X    case_reg(curline, curchar, mp->m_line, mp->m_char, up);
  2197. X    SetDot(&savedot);
  2198. X}
  2199. X
  2200. XUppWord()
  2201. X{
  2202. X    case_word(1);
  2203. X}
  2204. X
  2205. XLowWord()
  2206. X{
  2207. X    case_word(0);
  2208. X}
  2209. @//E*O*F case.c//
  2210. if test 2610 -ne "`wc -c <'case.c'`"; then
  2211.     echo shar: error transmitting "'case.c'" '(should have been 2610 characters)'
  2212. fi
  2213. fi # end of overwriting check
  2214. echo shar: extracting "'ctype.h'" '(1476 characters)'
  2215. if test -f 'ctype.h' ; then 
  2216.   echo shar: will not over-write existing file "'ctype.h'"
  2217. else
  2218. sed 's/^X//' >ctype.h <<'@//E*O*F ctype.h//'
  2219. X/************************************************************************
  2220. X * This program is Copyright (C) 1986 by Jonathan Payne.  JOVE is       *
  2221. X * provided to you without charge, and with no warranty.  You may give  *
  2222. X * away copies of JOVE, including sources, provided that this notice is *
  2223. X * included in all the files.                                           *
  2224. X ************************************************************************/
  2225. X
  2226. X/* The code in this file was snarfed from ctype.h and modified for JOVE. */
  2227. X
  2228. X#define    _U    01
  2229. X#define    _L    02
  2230. X#define    _N    04
  2231. X#define _P    010
  2232. X#define _C    020
  2233. X#define _W    040
  2234. X#define _Op    0100
  2235. X#define _Cl    0200
  2236. X
  2237. Xextern int    SyntaxTable;
  2238. X#define iswhite(c)    (isspace(c))
  2239. X#define isword(c)    ((CharTable[SyntaxTable])[c]&(_W))
  2240. X#define    isalpha(c)    ((CharTable[SyntaxTable])[c]&(_U|_L))
  2241. X#define    isupper(c)    ((CharTable[SyntaxTable])[c]&_U)
  2242. X#define    islower(c)    ((CharTable[SyntaxTable])[c]&_L)
  2243. X#define    isdigit(c)    ((CharTable[SyntaxTable])[c]&_N)
  2244. X#define    isspace(c)    (c == ' ' || c == '\t')
  2245. X#define ispunct(c)    ((CharTable[SyntaxTable])[c]&_P)
  2246. X#define toupper(c)    ((c)&~040)
  2247. X#define tolower(c)    ((c)|040)
  2248. X#define toascii(c)    ((c)&0177)
  2249. X#define isctrl(c)    ((CharTable[0][c&0177])&_C)
  2250. X#define isopenp(c)    ((CharTable[0][c&0177])&_Op)
  2251. X#define isclosep(c)    ((CharTable[0][c&0177])&_Cl)
  2252. X#define has_syntax(c,s)    ((CharTable[SyntaxTable][c&0177])&s)
  2253. X#define WITH_TABLE(x) \
  2254. X{ \
  2255. X    int    push = SyntaxTable; \
  2256. X    SyntaxTable = x;
  2257. X
  2258. X#define END_TABLE() \
  2259. X    SyntaxTable = push; \
  2260. X}
  2261. @//E*O*F ctype.h//
  2262. if test 1476 -ne "`wc -c <'ctype.h'`"; then
  2263.     echo shar: error transmitting "'ctype.h'" '(should have been 1476 characters)'
  2264. fi
  2265. fi # end of overwriting check
  2266. echo shar: extracting "'io.h'" '(1336 characters)'
  2267. if test -f 'io.h' ; then 
  2268.   echo shar: will not over-write existing file "'io.h'"
  2269. else
  2270. sed 's/^X//' >io.h <<'@//E*O*F io.h//'
  2271. X/************************************************************************
  2272. X * This program is Copyright (C) 1986 by Jonathan Payne.  JOVE is       *
  2273. X * provided to you without charge, and with no warranty.  You may give  *
  2274. X * away copies of JOVE, including sources, provided that this notice is *
  2275. X * included in all the files.                                           *
  2276. X ************************************************************************/
  2277. X
  2278. X#define putchar(c)    putc(c, stdout)
  2279. X#define putc(c, fp)    (--(fp)->f_cnt >= 0 ? (*(fp)->f_ptr++ = (c)) : _flush((c), fp))
  2280. X#define getc(fp)    (((--(fp)->f_cnt < 0) ? filbuf(fp) : *(fp)->f_ptr++))
  2281. X
  2282. Xtypedef struct {
  2283. X    int    f_cnt,        /* number of characters left in buffer */
  2284. X        f_bufsize,    /* size of what f_base points to */
  2285. X        f_fd,        /* fildes */
  2286. X        f_flags;    /* various flags */
  2287. X    char    *f_ptr,        /* current offset */
  2288. X        *f_base;    /* pointer to base */
  2289. X    char    *f_name;    /* name of open file */
  2290. X} File;
  2291. X
  2292. X#define F_READ        01
  2293. X#define F_WRITE        02
  2294. X#define F_APPEND    04
  2295. X#define F_MODE(x)    (x&07)
  2296. X#define F_EOF        010
  2297. X#define F_STRING    020
  2298. X#define F_ERR        040
  2299. X#define F_LOCKED    0100    /* don't close this file upon error */
  2300. X#define F_MYBUF        0200    /* f_alloc allocated the buffer, so
  2301. X                   f_close knows to free it up */
  2302. X
  2303. Xextern long    io_chars;
  2304. Xextern int    io_lines;
  2305. X
  2306. Xextern File
  2307. X    *stdout,
  2308. X
  2309. X    *open_file(),
  2310. X    *fd_open(),
  2311. X    *f_open();
  2312. @//E*O*F io.h//
  2313. if test 1336 -ne "`wc -c <'io.h'`"; then
  2314.     echo shar: error transmitting "'io.h'" '(should have been 1336 characters)'
  2315. fi
  2316. fi # end of overwriting check
  2317. if test ! -d 'doc' ; then
  2318.     echo shar: creating directory "'doc'"
  2319.     mkdir 'doc'
  2320. fi
  2321. echo shar: extracting "'MANIFEST'" '(2126 characters)'
  2322. if test -f 'MANIFEST' ; then 
  2323.   echo shar: will not over-write existing file "'MANIFEST'"
  2324. else
  2325. sed 's/^X//' >MANIFEST <<'@//E*O*F MANIFEST//'
  2326. X  File Name             Kit #   Description
  2327. X-----------------------------------------------------------
  2328. X MANIFEST                  1   This shipping list
  2329. X Makefile                  1
  2330. X Ovmakefile                1
  2331. X README                    1
  2332. X abbrev.c                  1
  2333. X ask.c                     1
  2334. X buf.c                     1
  2335. X c.c                       2
  2336. X case.c                    1
  2337. X ctype.c                   2
  2338. X ctype.h                   1
  2339. X delete.c                  2
  2340. X disp.c                    2
  2341. X doc                       1
  2342. X doc/README                8
  2343. X doc/cmds.doc.nr           2
  2344. X doc/example.rc            8
  2345. X doc/jove.1                9
  2346. X doc/jove.2               10
  2347. X doc/jove.3                8
  2348. X doc/jove.4               11
  2349. X doc/jove.5               12
  2350. X doc/jove.nr               9
  2351. X doc/recover.nr           10
  2352. X doc/system.rc             8
  2353. X doc/teach-jove           13
  2354. X doc/teachjove.nr          8
  2355. X extend.c                  3
  2356. X fmt.c                     2
  2357. X fp.c                      3
  2358. X funcdefs.c                3
  2359. X insert.c                  3
  2360. X io.c                      4
  2361. X io.h                      1
  2362. X iproc-pipes.c             4
  2363. X iproc-ptys.c              4
  2364. X iproc.c                   4
  2365. X jove.c                    5
  2366. X jove.h                    5
  2367. X keymaps.txt               4
  2368. X macros.c                  5
  2369. X malloc.c                  5
  2370. X marks.c                   5
  2371. X misc.c                    6
  2372. X move.c                    6
  2373. X paragraph.c               6
  2374. X portsrv.c                 6
  2375. X proc.c                    6
  2376. X re.c                      7
  2377. X re.h                      2
  2378. X re1.c                     6
  2379. X rec.c                     4
  2380. X rec.h                     2
  2381. X recover.c                 7
  2382. X scandir.c                 7
  2383. X screen.c                  7
  2384. X setmaps.c                 5
  2385. X table.c                   3
  2386. X table.h                   6
  2387. X teachjove.c               7
  2388. X temp.h                    8
  2389. X term.c                    8
  2390. X termcap.h                 8
  2391. X tune.h                    8
  2392. X tune.template             7
  2393. X util.c                    8
  2394. X vars.c                    8
  2395. X version.c                 7
  2396. X wind.c                    8
  2397. @//E*O*F MANIFEST//
  2398. if test 2126 -ne "`wc -c <'MANIFEST'`"; then
  2399.     echo shar: error transmitting "'MANIFEST'" '(should have been 2126 characters)'
  2400. fi
  2401. fi # end of overwriting check
  2402. echo shar: "End of archive 1 (of 13)."
  2403. cp /dev/null ark1isdone
  2404. DONE=true
  2405. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13; do
  2406.     if test -f ark${I}isdone; then
  2407.         echo "You have run archive ${I}."
  2408.     else
  2409.         echo "You still need to run archive ${I}."
  2410.         DONE=false
  2411.     fi
  2412. done
  2413. case $DONE in
  2414.     true)
  2415.         echo "You have run all 13 archives."
  2416.         echo 'Now read the README and Makefile.'
  2417.         ;;
  2418. esac
  2419. ##  End of shell archive.
  2420. exit 0
  2421.